package colibri.lcdui;


import colibri.App;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**O Header é um Item que fica disposto na parte superior dos objetos Form aos
 * quais ele for inserido, funcionando como uma "barra de títulos". Ele não pode
 * perder ou receber o foco, ou seja, mesmo quando visível, não influência na
 * navegação entre os itens do Form.
 * @author Bayron Thiengo Quinelato
 */
class Header extends Item {

    private Image imHeader;
    private int headerHeight;
    private int borderHeight;
    private int headerColor;
    private int borderColor;
    private String text;
    private int textY;
    private int textX;
    private int textAnchor;
    private int textColor;
    private Font textFont;

    /**Cria o item cabeçalho com uma imagem de fundo.
     * @param imHeader imagem do cabeçalho.
     * @param anchor ponto de ancoragem da imagem do cabeçalho. Para seu
     * correto posicionamento, deve ser uma dos seguintes pontos ancoras:
     * HEADER_ANCHOR_CENTER, HEADER_ANCHOR_LEFT ou HEADER_ANCHOR_RIGHT.
     */
    Header(Image imHeader, int anchor) {
        super(0, 0, imHeader.getWidth(), imHeader.getHeight(), anchor);
        if (imHeader == null) {
            throw new NullPointerException("Colibri error: Falha ao criar Header. O agumento 'imHeader' é nulo.");
        }
        this.imHeader = imHeader;
        super.label = "Header";
        super.focusable = false;

        headerHeight = 0;
        borderHeight = 0;
        headerColor = 0x000000;
        borderColor = 0xFFFFFF;
        text = null;
        textY = 0;
        textX = 0;
        textColor = 0xFFFFFF;
        textAnchor = 20;

        if (anchor == (Graphics.TOP|Graphics.LEFT) ||
                anchor == (Graphics.VCENTER|Graphics.LEFT) ||
                anchor == (Graphics.BOTTOM|Graphics.LEFT) ||
                anchor == (Graphics.BASELINE|Graphics.LEFT)) {
            super.anchor = (Graphics.TOP|Graphics.LEFT);

        } else if (anchor == (Graphics.TOP|Graphics.HCENTER) ||
                anchor == (Graphics.VCENTER|Graphics.HCENTER) ||
                anchor == (Graphics.BOTTOM|Graphics.HCENTER) ||
                anchor == (Graphics.BASELINE|Graphics.HCENTER)) {
            super.anchor = (Graphics.TOP|Graphics.HCENTER);
            super.x = App.halfWidth;

        } else if (anchor == (Graphics.TOP|Graphics.RIGHT) ||
                anchor == (Graphics.VCENTER|Graphics.RIGHT) ||
                anchor == (Graphics.BOTTOM|Graphics.RIGHT) ||
                anchor == (Graphics.BASELINE|Graphics.RIGHT)) {
            super.anchor = (Graphics.TOP|Graphics.RIGHT);
            super.x = App.width;

        } else {
            throw new NullPointerException("Colibri error: Falha ao criar Header. O agumento 'anchor' é inválido.");
        }
    }

    /**Cria o item Header com uma cor de fundo e uma borda.
     * @param headerColor cor de fundo do Header.
     * @param headerHeight altura do Header.
     * @param borderColor cor da borda.
     * @param borderHeight expessura da borda. A borda só fica visível na parte
     * inferior do Header. Se não quiser colocar a borda basta atribuir 0 (zero)
     * a este argumento.
     */
    Header(int headerColor, int headerHeight, int borderColor, int borderHeight) {
        super(0, 0, App.width, headerHeight + borderHeight);
        if (headerHeight < 0) {
            throw new NullPointerException("Colibri error: Falha ao criar Header. " +
                    "O agumento 'headerHeight' é negativo: " + headerHeight);
        } else if (borderHeight < 0) {
            throw new NullPointerException("Colibri error: Falha ao criar Header. " +
                    "O agumento 'borderHeight' é negativo: " + borderHeight);
        }
        super.label = "Header";
        super.focusable = false;
        this.headerColor = headerColor;
        this.headerHeight = headerHeight;
        this.borderColor = borderColor;
        this.borderHeight = borderHeight;

        text = null;
        textY = 0;
        textX = 0;
        textColor = 0xFFFFFF;
        textAnchor = 20;
    }

    /** Desenha o Header.
     * @param g objeto Graphics responsável por desenhar o Header.
     */
    protected void callPaint(Graphics g) {
        if (imHeader != null) {
            g.drawImage(imHeader, x, y, anchor);
        } else {
            if (headerHeight > 0) {
                g.setColor(headerColor);
                g.fillRect(0, 0, width, headerHeight);
                g.setColor(borderColor);
            }
            if (borderColor > 0) {
                if (borderHeight == 1) {
                    g.drawLine(0, headerHeight, width, headerHeight);
                } else {
                    g.fillRect(0, headerHeight, width, borderHeight);
                }
            }
        }
        if (text == null || text.length() <= 0) {
            return;
        }
        g.setColor(textColor);
        g.setFont(textFont);
        g.drawString(text, textX, textY, textAnchor);
    }

    /**Isere um texto no Header.
     * @param text texto que será inserido no Header.
     * @param textFont fonte com a qual o texto será escrito.
     * @param x posição horizontal do texto.
     * @param y posição vertical do texto.
     * @param anchor ponto de ancoragem do texto.
     */
    void setText(String text, Font font, int x, int y, int anchor) {
        if (font != null) {
            textFont = font;
        }
        setText(text, x, y, anchor);
    }

    /**Isere um texto no Header.
     * @param text texto que será inserido no Header.
     * @param textFont fonte com a qual o texto será escrito.
     * @param x posição horizontal do texto.
     * @param y posição vertical do texto.
     * @param anchor ponto de ancoragem do texto.
     */
    void setText(String text, int x, int y, int anchor) {
        this.text = text;
        this.textX = x;
        this.textY = y;
        this.textAnchor = anchor;
    }

    void setFont(Font font) {
        this.textFont = font;
    }

    Font getFont() {
        return textFont;
    }

    void setTextColor(int color) {
        this.textColor = color;
    }
}
